/**
 * 配置工具函数
 */
const path = require("path")
const fs = require("fs")
const defaultConfig = require("../../config/default")

/**
 * 合并配置
 * @param {Object} userConfig - 用户配置
 * @returns {Object} 合并后的配置
 */
function mergeConfig(userConfig = {}) {
  return {
    ...defaultConfig,
    ...userConfig,
    // 深度合并特定对象
    alias: { ...defaultConfig.alias, ...userConfig.alias },
    analysis: { ...defaultConfig.analysis, ...userConfig.analysis },
    report: { ...defaultConfig.report, ...userConfig.report },
  }
}

/**
 * 自动检测项目配置文件
 * @param {string} projectRoot - 项目根目录
 * @returns {Object} 检测到的配置
 */
function detectProjectConfig(projectRoot) {
  // 初始化返回的配置对象
  const detectedConfig = {
    alias: {},
  }

  try {
    // 检查webpack配置
    const webpackConfigPaths = [
      path.join(projectRoot, "webpack.config.js"),
      path.join(projectRoot, "webpack.common.js"),
      path.join(projectRoot, "config", "webpack.config.js"),
    ]

    for (const configPath of webpackConfigPaths) {
      if (fs.existsSync(configPath)) {
        console.log(`找到Webpack配置: ${configPath}`)
        // TODO: 解析webpack配置中的alias
      }
    }

    // 检查vite配置
    const viteConfigPaths = [
      path.join(projectRoot, "vite.config.js"),
      path.join(projectRoot, "vite.config.ts"),
    ]

    for (const configPath of viteConfigPaths) {
      if (fs.existsSync(configPath)) {
        console.log(`找到Vite配置: ${configPath}`)
        // TODO: 解析vite配置中的alias
      }
    }

    // 检查tsconfig.json中的paths配置
    const tsconfigPath = path.join(projectRoot, "tsconfig.json")
    if (fs.existsSync(tsconfigPath)) {
      try {
        console.log("找到tsconfig.json")
        const tsConfig = JSON.parse(fs.readFileSync(tsconfigPath, "utf-8"))
        if (tsConfig.compilerOptions && tsConfig.compilerOptions.paths) {
          console.log("检测到tsconfig.json中的路径别名")

          // 处理paths别名
          const paths = tsConfig.compilerOptions.paths
          const baseUrl = tsConfig.compilerOptions.baseUrl || "."

          for (const [alias, targets] of Object.entries(paths)) {
            if (targets && targets.length > 0) {
              // 移除路径中的通配符如 /*
              const cleanAlias = alias.replace(/\/\*$/, "")
              const cleanTarget = targets[0].replace(/\/\*$/, "")
              detectedConfig.alias[cleanAlias] = path.join(
                projectRoot,
                baseUrl,
                cleanTarget
              )
            }
          }
        }
      } catch (error) {
        console.error("解析tsconfig.json时出错:", error.message)
      }
    }
  } catch (error) {
    console.error("检测项目配置时出错:", error.message)
  }

  return detectedConfig
}

/**
 * 验证配置是否有效
 * @param {Object} config - 配置对象
 * @returns {boolean} 是否有效
 */
function validateConfig(config) {
  // 检查必须的字段
  if (!config.extensions || !Array.isArray(config.extensions)) {
    console.error("无效配置: extensions必须是数组")
    return false
  }

  if (!config.ignorePaths || !Array.isArray(config.ignorePaths)) {
    console.error("无效配置: ignorePaths必须是数组")
    return false
  }

  return true
}

module.exports = {
  mergeConfig,
  detectProjectConfig,
  validateConfig,
}
